<?php

namespace backend\modules\demo\models\search;

use backend\modules\demo\models\EsLog;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\models\demo;
use yii\elasticsearch\Query;


class EsSearch extends EsLog
{

    public function rules(): array
    {
        return [
            [['id', 'level', 'category', 'timestamp','trace', 'message'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search(array $params)
    {
        $query = new Query();
        $query->from('yii', 'log');
       // $query->orderBy('log_time DESC');
        //范围查询
//        $query->query(['range' => ['log_time' => [
//            'gte' => '1511683261',
//            'lte' => '1525748360',
//        ]]]);



        //精确查询
       // $query->query(["term"=>["category"=>"test"]]);
//        $query->query([
//            'bool' => [
//                'should' => [
//                    'match' => ['category' => $params['dateTo']],
//                    'match' => ['level'    => $params['level']],
//                ],
//                'must_not' => [
//                    'match' => ['level'    => $params['level']],
//                ],
//            ],
//        ]);
       // $query->query(["match" => ["category" => "application"]]);
      //  $query->query(["prefix" => ["prefix" => "fronte"]]);



        //组合查询
//       $param= [
//            'bool' => [
//                'should' => [
//                    ['match' => ['prefix' => $name]],
//                    ['match' => ['category' => $name]],
//                ],
//                'must_not' => [
//                   ['match' => ['level' => $level]],
//                ],
//            ],
//        ]
//      $query->query($param);
//

        //模糊查询
       // $query->query(["match_phrase_prefix" => ["prefix" => ["query"=>'front',"max_expansions"=>3]]]);//短语查询 建议等
//        $query->query(["multi_match" => [
//            "query"=>'front',
//            "fields"=>['prefix','category'],
//            'type'=>"phrase_prefix",
//        ]]);



        //纠错查询,编辑距离默认是2，
        //
        // 显然，从 beaver 转换成 bieber 是一个很长的过程—他们相距甚远而不能视为一个简单的拼写错误。 Damerau 发现 80% 的拼写错误编辑距离为 1 。换句话说， 80% 的拼写错误可以对原始字符串用 单次编辑 进行修正。
        //
        //Elasticsearch 指定了 fuzziness 参数支持对最大编辑距离的配置，默认为 ２ 。
        //
        //当然，单次编辑对字符串的影响取决于字符串的长度。对单词 hat 两次编辑能够产生 mad ， 所以对一个只有 3 个字符长度的字符串允许两次编辑显然太多了。 fuzziness 参数可以被设置为 AUTO ，这将导致以下的最大编辑距离：
        //
        //字符串只有 1 到 2 个字符时是 0
        //字符串有 3 、 4 或者 5 个字符时是 1
        //字符串大于 5 个字符时是 2
        //当然，你可能会发现编辑距离 2 仍然是太多了，返回的结果似乎并不相关。 把最大 fuzziness 设置为 1 ，你可以得到更好的结果和更好的性能。
       // $query->query(["fuzzy" => ["prefix" => "bacckend"]]);
       // $query->query(["match"=>["prefix"=>["query"=>"bacckend","fuzziness"=>"AUTO","operator"=>"and"]]]);
       // $query->query(["multi_match"=>["fields"=>["prefix", "message"],"query"=>"bacckend","fuzziness"=>"AUTO"]]);




      $dataProvider = new \yii\elasticsearch\ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 20,
            ],
        ]);

        return $dataProvider;
    }
}